package com.lonely.common.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * redis锁注解
 *
 * @author fzzf
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedisLock {

    /**
     * 锁的key，支持SpEL表达式
     */
    String key() default "";

    /**
     * 锁类型
     */
    LockType lockType() default LockType.REENTRANT;

    /**
     * 等待时间(ms)，-1表示阻塞直到获取锁，0表示不等待立即返回
     */
    long waitTime() default -1;

    /**
     * 锁自动释放时间(ms)，-1表示使用看门狗机制自动续期
     */
    long leaseTime() default -1;

    /**
     * 时间单位
     */
    TimeUnit unit() default TimeUnit.MILLISECONDS;

    /**
     * 获取锁失败时的处理策略
     */
    LockFailStrategy failStrategy() default LockFailStrategy.THROW_EXCEPTION;

    enum LockType {
        REENTRANT,  // 可重入锁
        FAIR,       // 公平锁
        READ,       // 读锁
        WRITE       // 写锁
    }

    enum LockFailStrategy {
        THROW_EXCEPTION,  // 抛出异常
        RETURN_NULL,     // 返回null
        IGNORE           // 继续执行业务逻辑
    }
}